﻿using System;
using System.Drawing;
using System.Xml;
using System.Windows.Forms;
using Engine;
using Gencode;
using Library;
using MyControls;
using System.Collections.Generic;

namespace GameTool
{
    public partial class SoSanh_Form1 : Form
    {
        #region Declare variables
        public MainForm mainForm;
        private int _currentGroup = 0;//trang hiện tại; trang đánh số bắt đầu từ 0
        private int _currentPage = 0;//trang hiện tại; trang đánh số bắt đầu từ 0
        private int _soDongTrenTrang = 4;//số dòng trên một trang
        private int _soPTTrenDong = 2;//số item trên một dòng
        private bool _isClearTab = false;

        private List<List<SSCom>> _components = null;
        private List<List<SSCom>> Components
        {
            set { _components = value; }
            get
            {
                if(_components == null)
                    _components = new List<List<SSCom>>();
                if(_components.Count != 0)
                {
                    txtCounter.Text = _components[_currentGroup].Count.ToString();
                    this.txtPage.Text = (this._currentPage + 1).ToString();
                }
                else
                {
                    txtCounter.Text = "0";
                }
                return _components;
            }
        }
        private Button[] delButton;

        private char _hash = ';';//ký tự phân cách dùng để băm trong trường hợp nhập nhanh
        #endregion

        #region Constructors
        public SoSanh_Form1()
        {
            InitializeComponent();
            Init();
        }
        #endregion

        #region User's Methods

        /// <summary>
        /// Đổ dữ liệu vào các combobox
        /// </summary>
        private void InitData()
        {
            try
            {
                foreach (ClassInfo c in Common.ClassList)
                {
                    if (User.CheckPermission(c.Name))
                    {
                        cmbLop.Items.AddRange(new object[] { "lop" + c.Name });
                        //int aa = c.ID;

                    }
                }
                if (cmbLop.Items.Count > 0)
                {
                    cmbLop.SelectedIndex = 0;
                }

                cmbLevel.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void LoadXML(string url, string filename)
        {            
            try
            {
                XmlDocument xDoc = new XmlDocument();

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                this.cmbLop.Text = SoSanh_Form2.Instance.Lop;
                this.cmbVong.Text = SoSanh_Form2.Instance.Vong;

                // Parser File Xml.
                XmlNodeList code = xDoc.GetElementsByTagName("code");
                string codeString = code[0].InnerText;
                this.txtBaiThiSo.Text = codeString;

                XmlNodeList subject = xDoc.GetElementsByTagName("subject");
                string subjectString = subject[0].InnerText;
                this.txtTenBaiThi.Text = subjectString;

                XmlNodeList time = xDoc.GetElementsByTagName("time");
                string timeString = time[0].InnerText;
                this.nUDThoiGian.Value = Int32.Parse(timeString);

                XmlNodeList rule = xDoc.GetElementsByTagName("rule");
                string ruleString = rule[0].InnerText;
                this.txtDeBai.Text = ruleString;

                XmlNodeList pointNode = xDoc.GetElementsByTagName("point");
                string point = pointNode[0].InnerText;
                this.nUDDiem.Value = Int32.Parse(point);

                XmlNodeList giftPointNode = xDoc.GetElementsByTagName("giftPoint");
                string giftPoint = giftPointNode[0].InnerText;
                this.nUDDiemThuong.Value = Int32.Parse(giftPoint);

                XmlNodeList numRow = xDoc.GetElementsByTagName("numRow");
                string numRowString = numRow[0].InnerText;
                this.nUDSoDong.Value = Convert.ToByte(numRowString);

                XmlNodeList numCol = xDoc.GetElementsByTagName("numCol");
                string numColString = numCol[0].InnerText;
                this.nUDSoCot.Value = Convert.ToByte(numColString);

                XmlNodeList maxErrorNode = xDoc.GetElementsByTagName("maxerror");
                string maxError = maxErrorNode[0].InnerText;
                this.nUDSoLoi.Value = Convert.ToByte(maxError);

                XmlNodeList numLevel1Node = xDoc.GetElementsByTagName("numLevel1");
                string numLevel1 = numLevel1Node[0].InnerText;
                if (numLevel1.Length > 0)
                    this.nUDDe.Value = Convert.ToByte(numLevel1);
                else
                    this.nUDDe.Value = 0;

                XmlNodeList numLevel2Node = xDoc.GetElementsByTagName("numLevel2");
                string numLevel2 = numLevel2Node[0].InnerText;
                if (numLevel2.Length > 0)
                    this.nUDBinhThuong.Value = Convert.ToByte(numLevel2);
                else
                    this.nUDBinhThuong.Value = 0;

                XmlNodeList numLevel3Node = xDoc.GetElementsByTagName("numLevel3");
                string numLevel3 = numLevel3Node[0].InnerText;
                if (numLevel3.Length > 0)
                    this.nUDKho.Value = Convert.ToByte(numLevel3);
                else
                    this.nUDKho.Value = 0;
                // Dua cac thong tin ve cau hoi
                XmlNodeList numQuestions = xDoc.GetElementsByTagName("question");

                string _currentgroup = string.Empty;
                int _currentIndex = -1;
                for (int i = 0; i < numQuestions.Count; i++)
                {
                    string fileimage = numQuestions[i].ChildNodes[1].InnerText;
                    int level = System.Convert.ToInt32(numQuestions[i].ChildNodes[0].InnerText);
                    Bitmap image = new Bitmap(ftp_main.GetPicture(GetImagePath() + "\\" + cmbVong.Text, fileimage));
                    if (_currentgroup != numQuestions[i].Attributes[0].Value)
                    {
                        _currentgroup = numQuestions[i].Attributes[0].Value;
                        Components.Add(new List<SSCom>());
                        _currentIndex = -1;
                    }
                    _currentIndex ++;
                    SSCom com = new SSCom(level, fileimage, image, _currentgroup);
                    AddCom(com, int.Parse(_currentgroup), _currentIndex);
                }

                for (int i = 0; i < Components.Count; i++)
                {
                    AddGroup(i.ToString());
                }

                _currentGroup = 0;
                _currentPage = 0;                
                ShowCom(_currentGroup, _currentPage);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Thêm component
        /// </summary>
        /// <param name="com">Component cần thêm</param>
        /// <param name="group">Nhóm cần thêm</param>
        /// <param name="index">Vị trí thêm</param>
        private void AddCom(SSCom com, int group, int index)
        {
            try
            {
                if(Components.Count == 0)
                {
                    AddGroup("0");
                    _currentGroup = 0;
                    Components.Add(new List<SSCom>());
                }
                com.Visible = false;
                Components[group].Insert(index, com);
                this.pnlQuestion.Controls.Add(com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Hiển thị các component
        /// </summary>
        /// <param name="group">Nhóm cần hiển thị</param>
        /// <param name="trang">Trang cần hiển thị</param>
        private void ShowCom(int group, int trang)
        {
            try
            {             
                VisiableButton();
                int _soPTTrenTrang = _soDongTrenTrang * _soPTTrenDong;
                int _start = trang * _soPTTrenTrang;//vị trí bắt đầu show
                int _end = (trang * _soPTTrenTrang) + (_soPTTrenTrang - 1);//vị trí end show
                List<SSCom> thiscomponent = Components[group];

                cmbLevel.SelectedIndex = (thiscomponent.Count > 0)?thiscomponent[0].Level:0;
                if (_end >= thiscomponent.Count)
                {
                    _end = thiscomponent.Count - 1;
                }

                int _x = 5;
                int _y = 0;
                int curx = _x;
                int cury = _y;
                int counter = 0;
                for (int i = _start; i <= _end; i++)
                {
                    if (counter == _soPTTrenDong)
                    {
                        curx = _x;
                        cury += thiscomponent[i].Height + 5;
                        counter = 0;
                    }

                    this.delButton[i % _soPTTrenTrang].Visible = true;
                    this.delButton[i % _soPTTrenTrang].Location = new Point(curx + thiscomponent[i].Width, cury);

                    thiscomponent[i].PT = "PT" + (i + 1).ToString();
                    thiscomponent[i].Visible = true;
                    thiscomponent[i].Location = new Point(curx, cury);
                    curx += thiscomponent[i].Width + 70;
                    counter++;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn các component
        /// </summary>
        /// <param name="group"></param>
        /// <param name="trang"></param>
        private void HideCom(int group, int trang)
        {
            try
            {
                int _soPTTrenTrang = _soDongTrenTrang * _soPTTrenDong;
                int _start = trang * _soPTTrenTrang;//vị trí bắt đầu show
                int _end = (trang * _soPTTrenTrang) + (_soPTTrenTrang - 1);//vị trí end show
                List<SSCom> thiscomponent = Components[group];
                if (_end >= thiscomponent.Count)
                {
                    _end = thiscomponent.Count - 1;
                }
                for (int i = _start; i <= _end; i++)
                {
                    thiscomponent[i].Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Xóa các component
        /// </summary>
        /// <param name="group">Nhóm cần xóa</param>
        /// <param name="index">Vị trí cần xóa</param>
        private void DelCom(int group, int index)
        {
            try
            {
                if (group > Components.Count)
                {
                    return;
                }
                List<SSCom> thiscomponent = Components[group];
                this.pnlQuestion.Controls.Remove(thiscomponent[index]);
                thiscomponent.RemoveAt(index);
                if (_currentPage * _soPTTrenDong * _soDongTrenTrang >= thiscomponent.Count)
                    _currentPage--;
                if (_currentPage < 0)
                    _currentPage = 0;

                #region Focus
                if (-1 < index && index < thiscomponent.Count)
                {
                    thiscomponent[index].Focus();
                }
                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Add các tabpage (~ nhóm)
        /// </summary>
        /// <param name="groupName">Tên nhóm</param>
        private void AddGroup(string groupName)
        {
            try
            {
                TabPage tab = new TabPage();
                tab.Name = groupName;
                tab.Text = "Nhóm " + (int.Parse(groupName) + 1);
                this.tabGroup.TabPages.Add(tab);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Tạo các nút bấm để xóa phần tử
        /// </summary>
        private void Init()
        {
            try
            {
                delButton = new Button[_soDongTrenTrang * _soPTTrenDong];
                for (int i = 0; i < delButton.Length; i++)
                {
                    this.delButton[i] = new Button();
                    this.delButton[i].Text = "Xóa";
                    this.delButton[i].Name = i.ToString();
                    this.delButton[i].Size = new Size(47, 23);
                    this.delButton[i].Click += new EventHandler(cmdDel_Click);
                    this.pnlQuestion.Controls.Add(this.delButton[i]);
                    this.delButton[i].Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn các button thêm và xóa component
        /// </summary>
        private void VisiableButton()
        {
            try
            {
                for (int i = 0; i < delButton.Length; i++)
                {
                    this.delButton[i].Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu đầu vào trước khi lưu
        /// </summary>
        /// <returns>Thông điệp trả về: thông điệp trắng là hợp lệ</returns>
        private string ValidateInput()
        {
            string _mess = string.Empty;
            try
            {
                if (!chkViolympic.Checked && !chkViSchool.Checked && !chkViother.Checked)
                {
                    _mess = "Bạn chưa chọn nhập liệu cho chương trình nào.";
                    chkViolympic.Focus();
                    return _mess;
                }
                if (cmbLop.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn lớp.";
                    cmbLop.DroppedDown = true;
                    cmbLop.Focus();
                    return _mess;
                }
                if (cmbVong.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn Vòng.";
                    cmbVong.DroppedDown = true;
                    cmbVong.Focus();
                    return _mess;
                }
                int _totalQuestion = (int)(nUDDe.Value + nUDBinhThuong.Value + nUDKho.Value);
                if (_totalQuestion == 0)
                {
                    _mess = "(S. câu dễ + S. câu tb + S. câu khó) > 0.";
                    nUDDe.Focus();
                    return _mess;
                }
                if (nUDSoDong.Value * nUDSoCot.Value != (nUDDe.Value + nUDBinhThuong.Value + nUDKho.Value) * 2)
                {
                    _mess =
                        "Dữ liệu không hợp lý.\n(Số dòng x số cột) phải bằng 2 lần (Số câu dễ + số câu bình thường + số câu khó)";
                    nUDSoDong.Focus();
                    return _mess;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }

            return _mess;
        }

        private string Warning()
        {
            string _mess = string.Empty;
            try
            {
                int _e = 0;//dễ
                int _m = 0;//trung bình
                int _h = 0;//khó
                int _pe = 0;//cặp dễ
                int _pm = 0;//cặp trung bình
                int _ph = 0;//cặp khó
                foreach (List<SSCom> list in Components)
                {
                    _e = 0;
                    _m = 0;
                    _h = 0;
                    
                    foreach (SSCom ssCom in list)
                    {
                        switch (ssCom.Level)
                        {
                            case 0:
                                _e++;
                                break;
                            case 1:
                                _m++;
                                break;
                            case 2:
                                _h++;
                                break;
                        }
                    }
                    _pe += _e/2;
                    _pm += _m/2;
                    _ph += _h/2;
                }

                if (_pe < nUDDe.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu dễ chưa đủ";
                }
                
                if (_pm < nUDBinhThuong.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu tb chưa đủ";
                }
                
                if (_ph < nUDKho.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu khó chưa đủ";
                }

                if (_mess.Length > 0)
                    _mess += "\nđể game chạy!";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return _mess;
        }

        /// <summary>
        /// Đẩy dữ liệu lên server
        /// </summary>
        /// <returns></returns>
        private string UploadXML()
        {
            string result = string.Empty;
            try
            {
                XmlDocument doc = new XmlDocument();
                XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc.AppendChild(docNode);
                XmlNode examinateNode = doc.CreateElement("examinate");
                doc.AppendChild(examinateNode);

                XmlNode codeNode = doc.CreateElement("code");
                codeNode.AppendChild(doc.CreateTextNode(this.txtBaiThiSo.Text));
                examinateNode.AppendChild(codeNode);

                XmlNode nameNode = doc.CreateElement("subject");
                nameNode.AppendChild(doc.CreateTextNode(this.txtTenBaiThi.Text.Trim()));
                examinateNode.AppendChild(nameNode);

                XmlNode timeNode = doc.CreateElement("time");
                timeNode.AppendChild(doc.CreateTextNode(this.nUDThoiGian.Value.ToString()));
                examinateNode.AppendChild(timeNode);

                XmlNode subjectNode = doc.CreateElement("rule");
                subjectNode.AppendChild(doc.CreateTextNode(this.txtDeBai.Text.Trim()));
                examinateNode.AppendChild(subjectNode);

                XmlNode pointNode = doc.CreateElement("point");
                pointNode.AppendChild(doc.CreateTextNode(this.nUDDiem.Value.ToString()));
                examinateNode.AppendChild(pointNode);

                XmlNode giftNode = doc.CreateElement("giftPoint");
                giftNode.AppendChild(doc.CreateTextNode(this.nUDDiemThuong.Value.ToString()));
                examinateNode.AppendChild(giftNode);

                XmlNode rowNode = doc.CreateElement("numRow");
                rowNode.AppendChild(doc.CreateTextNode(this.nUDSoDong.Value.ToString()));
                examinateNode.AppendChild(rowNode);

                XmlNode colNode = doc.CreateElement("numCol");
                colNode.AppendChild(doc.CreateTextNode(this.nUDSoCot.Value.ToString()));
                examinateNode.AppendChild(colNode);

                // Tao so loi toi da
                XmlNode maxErrorNode = doc.CreateElement("maxerror");
                maxErrorNode.AppendChild(doc.CreateTextNode(this.nUDSoLoi.Value.ToString()));
                examinateNode.AppendChild(maxErrorNode);

                // Tao ra so cau hoi muc 1
                XmlNode numLevel1 = doc.CreateElement("numLevel1");
                numLevel1.AppendChild(doc.CreateTextNode(this.nUDDe.Value.ToString()));
                examinateNode.AppendChild(numLevel1);

                // Tao ra so cau hoi muc 2
                XmlNode numLevel2 = doc.CreateElement("numLevel2");
                numLevel2.AppendChild(doc.CreateTextNode(this.nUDBinhThuong.Value.ToString()));
                examinateNode.AppendChild(numLevel2);

                // Tao ra so cau hoi muc 3
                XmlNode numLevel3 = doc.CreateElement("numLevel3");
                numLevel3.AppendChild(doc.CreateTextNode(this.nUDKho.Value.ToString()));
                examinateNode.AppendChild(numLevel3);

                for (int i = 0; i < this.Components.Count; i++)
                {
                    XmlNode questionsNode = doc.CreateElement("questions");
                    examinateNode.AppendChild(questionsNode);

                    List<SSCom> thiscomponent = this.Components[i];
                    for (int j = 0; j < thiscomponent.Count; j++)
                    {
                        // Tao ra mot question node
                        XmlNode questionNode = doc.CreateElement("question");
                        // Tao Attribute
                        XmlAttribute attribute = doc.CreateAttribute("value");
                        attribute.Value = thiscomponent[j].Group.ToString();
                        questionNode.Attributes.Append(attribute);

                        XmlNode levelNode = doc.CreateElement("level");
                        levelNode.AppendChild(doc.CreateTextNode(thiscomponent[j].Level.ToString()));
                        questionNode.AppendChild(levelNode);

                        thiscomponent[j].MyCapture(int.Parse(cmbLop.Text.Substring(3, cmbLop.Text.Length - 3)));

                        XmlNode contentNode = doc.CreateElement("content");
                        string fileName = thiscomponent[j].FileName;
                        contentNode.AppendChild(doc.CreateTextNode(fileName));
                        questionNode.AppendChild(contentNode);

                        questionsNode.AppendChild(questionNode);

                        string pathName = thiscomponent[j].FullPath;
                        if (thiscomponent[j].Modify)
                        {
                            UploadFile.UpFtpFile(GetImagePath(), cmbVong.Text, fileName, pathName);
                        }
                    }
                }

                string xmlFile = "1.xml";
                doc.Save(xmlFile);
                UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text, xmlFile, xmlFile);
                System.IO.File.Delete(xmlFile);
                INSERT();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!huyaq", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return result;
        }

        /// <summary>
        /// Lấy vị trí cần lưu file xml trên server
        /// </summary>
        /// <returns></returns>
        private string GetXMLPath()
        {
            return Common.config.pathXml + "\\" + cmbLop.Text + "\\Game2";
        }

        /// <summary>
        /// Lấy vị trí lưu file ảnh trên server
        /// </summary>
        /// <returns></returns>
        private string GetImagePath()
        {
            return Common.config.pathImage + "\\" + cmbLop.Text + "\\Game2";
        }

        /// <summary>
        /// Reset các control về giá trị ban đầu.
        /// </summary>
        private void Reset()
        {
            try
            {
                chkViother.Checked = chkViSchool.Checked = !(chkViolympic.Checked = true);
                if (cmbLop.Items.Count > 0)
                    cmbLop.SelectedIndex = 0;
                cmbVong.SelectedIndex = -1;
                nUDSoDong.Value = nUDSoDong.Minimum;
                nUDSoCot.Value = nUDSoCot.Minimum;
                nUDThoiGian.Value = nUDThoiGian.Minimum;
                nUDDe.Value = nUDDe.Minimum;
                nUDBinhThuong.Value = nUDBinhThuong.Minimum;
                nUDKho.Value = nUDKho.Minimum;
                nUDDiem.Value = nUDDiem.Minimum;
                nUDSoLoi.Value = nUDSoLoi.Minimum;
                nUDDiemThuong.Value = nUDDiemThuong.Minimum;
                txtBaiThiSo.Clear();
                txtTenBaiThi.Clear();
                txtDeBai.Clear();
                cmdAddGroup.Visible = pnlCmd.Visible = pnlQuestion.Visible = true;

                for (int i = 0; i < Components.Count; i++)
                {
                    List<SSCom> thiscomponent = this.Components[i];
                    while (thiscomponent.Count > 0)
                    {
                        DelCom(i, 0);
                    }
                }
                this.VisiableButton();
                Components.Clear();
                _isClearTab = true;
                this.tabGroup.TabPages.Clear();
                _isClearTab = false;
                this._currentGroup = this._currentPage = 0;
                this.txtNhapNhanh.Clear();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!a", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        #endregion

        #region Events
        private void cmdDel_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult = MessageBox.Show("Xóa phần tử này?", "Xac nhan thao tac",
                                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (_dialogResult == DialogResult.No)
                {
                    return;
                }
                string name = ((Button)sender).Name;
                int idx = System.Convert.ToInt32(name);
                int cur = idx + _currentPage * _soDongTrenTrang * _soPTTrenDong;

                DelCom(_currentGroup, idx);
                ShowCom(_currentGroup, _currentPage);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!b", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void Review_Click(object sender, EventArgs e)
        {
            _currentPage = 0;
            DialogResult _dialogResult =
                    MessageBox.Show(
                        "Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn xem đề?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (_dialogResult == System.Windows.Forms.DialogResult.No)
                return;
            try
            {
                SoSanh_Form2.Instance.ShowDialog();
                string lop = SoSanh_Form2.Instance.Lop;
                string vong = SoSanh_Form2.Instance.Vong;
                String url = Common.config.pathXml + "\\" + lop + "\\Game2\\" + vong;
                if (lop.Length > 0 && vong.Length > 0)
                {
                    #region Reset
                    cmdAddGroup.Visible = pnlCmd.Visible = pnlQuestion.Visible = true;
                    VisiableButton();
                    for (int i = 0; i < Components.Count; i++)
                    {
                        List<SSCom> thiscomponent = this.Components[i];
                        while (thiscomponent.Count > 0)
                        {
                            DelCom(i, 0);
                        }
                    }
                    Components.Clear();
                    this._isClearTab = true;
                    tabGroup.TabPages.Clear();
                    this._isClearTab = false;
                    this.txtNhapNhanh.Clear();
                    #endregion

                    this._currentPage = this._currentGroup = 0;
                    LoadXML(url, "1.xml");
                }
                SoSanh_Form2.Instance.Lop = string.Empty;
                SoSanh_Form2.Instance.Vong = string.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!c", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void NextPage_Click(object sender, EventArgs e)
        {
            try
            {
                if(Components.Count == 0)
                {
                    MessageBox.Show("Đang ở trang cuối cùng!", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                List<SSCom> thiscomponent = Components[_currentGroup];
                int _totalPage = (thiscomponent.Count) / (_soDongTrenTrang * _soPTTrenDong);
                if ((thiscomponent.Count) % (_soDongTrenTrang * _soPTTrenDong) > 0)
                    _totalPage++;
                if (_currentPage < _totalPage - 1)
                {
                    HideCom(_currentGroup , _currentPage);
                    _currentPage++;
                    ShowCom(_currentGroup, _currentPage);
                }
                else
                {
                    MessageBox.Show("Đang ở trang cuối cùng!", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!d", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void tabGroup_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                /*
                 * Khi load đề lên thì phải xóa hết các nhóm của đề cũ
                 * Để xóa các nhóm cũ thì phải xóa các tabpage
                 * Xóa tabpage thì sự kiện này xảy ra và sinh lỗi
                 * Checkk biến để biết khi xóa tabpage ta không xử lý gì cả
                 */
                if (_isClearTab)
                    return;
                HideCom(_currentGroup, _currentPage);
                _currentGroup = int.Parse(tabGroup.TabPages[tabGroup.SelectedIndex].Name);
                _currentPage = 0;

                ShowCom(_currentGroup, _currentPage);
            }
            catch(Exception ex)
            {
                MessageBox.Show("Có lỗi!e", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void PrePage_Click(object sender, EventArgs e)
        {
            try
            {
                if (_currentPage > 0)
                {
                    HideCom(_currentGroup , _currentPage);
                    _currentPage--;
                    ShowCom(_currentGroup, _currentPage);
                }
                else
                {
                    MessageBox.Show("Đang ở trang đầu tiên!", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!f", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void SoSanh_Form1_Load(object sender, EventArgs e)
        {
            InitData();
            cmdAddGroup.Visible = pnlCmd.Visible = pnlQuestion.Visible = false;
        }

        private void cmbLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cmbVong.Items.Clear();
                foreach (RoundInfo roundInfo in Common.RoundList[cmbLop.SelectedIndex])
                {
                    this.cmbVong.Items.AddRange(new object[] { "level" + roundInfo.RoundNumber });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!g", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Console.WriteLine(ex.Message+":"+ex.StackTrace);
                Application.Exit();
            }
        }

        private void Upload_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult;
                string _mess;
                #region Validate
                _mess = ValidateInput();
                if (_mess.Length > 0)
                {
                    _mess += "\nVui lòng kiểm tra lại!";
                    MessageBox.Show(_mess, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                #endregion
                #region Exists
                bool _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text, "1.xml");
                if (_exists)
                {
                    _dialogResult = MessageBox.Show("Đề bài của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        return;
                    }
                }
                #endregion
                #region Warning
                _mess = Warning();
                if (_mess.Length > 0)
                {
                    _mess += "\nBạn có muốn tải lên server?";
                    _dialogResult = MessageBox.Show(_mess, "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        return;
                    }
                }

                #endregion
                string result = UploadXML();
                if (result.Length > 0)
                {
                    MessageBox.Show(result);
                }
                else
                {
                    Common.LogAction(Library.Action.Update);
                    MessageBox.Show("Tải đề lên server thành công!", "Thong bao", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!h", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void btnAddSScom_Click(object sender, EventArgs e)
        {
            try
            {
                SSCom com = new SSCom();
                com.Group = this._currentGroup.ToString();
                com.Level = cmbLevel.SelectedIndex;
                if(this.Components.Count > 0)//đề phòng trường hợp nhấn lần đầu tiên, khi đó chưa có group nào nhưng _currentGroup lại = 0
                    HideCom(this._currentGroup, this._currentPage);
                _currentPage = 0;
                AddCom(com, this._currentGroup, this._currentPage);
                ShowCom(this._currentGroup, this._currentPage);
                com.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!h", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmbLevel_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (Components.Count == 0)
                {
                    return;
                }
                List<SSCom> thiscomponent = this.Components[_currentGroup];
                for (int i = 0; i < thiscomponent.Count; i++)
                {
                    thiscomponent[i].Level = cmbLevel.SelectedIndex;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!j", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdAddGroup_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Components.Count != 0)
                    HideCom(_currentGroup, _currentPage);
                this.Components.Add(new List<SSCom>());
                AddGroup((Components.Count - 1).ToString());
                this._currentGroup = Components.Count - 1;
                this._currentPage = 0;
                this.tabGroup.SelectedIndex = this.Components.Count - 1;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!k", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdTaoDeMoi_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult =
                    MessageBox.Show("Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn tạo mới?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (_dialogResult == DialogResult.Yes)
                    Reset();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        #endregion

        #region Access to database
        private void INSERT()
        {
            GameQuestion insertDataBase = new GameQuestion();
            GameQuestionInfo gameInfo = new GameQuestionInfo();
            gameInfo.ClassID = ((ClassInfo)Common.ClassList[cmbLop.SelectedIndex]).ID;
            gameInfo.CodeName = this.txtBaiThiSo.Text;
            gameInfo.Description = this.txtDeBai.Text;
            gameInfo.GameID = 2;
            gameInfo.QuestionID = 1;
            gameInfo.SubjectID = 1;
            gameInfo.Round = ((RoundInfo)Common.RoundList[cmbLop.SelectedIndex][cmbVong.SelectedIndex]).RoundNumber;
            gameInfo.RoundID = ((RoundInfo)Common.RoundList[cmbLop.SelectedIndex][cmbVong.SelectedIndex]).ID;
            gameInfo.Type = 0;
            insertDataBase.Insert(gameInfo);
        }
        #endregion
        private void cmdNhapNhanh_Click(object sender, EventArgs e)
        {
            txtNhapNhanh.Text = txtNhapNhanh.Text.Trim();
            if (txtNhapNhanh.Text.Length == 0 || txtNhapNhanh.Text.IndexOf(_hash) == 0)
            {
                return;
            }

            string[] _questionList = this.txtNhapNhanh.Text.Split(_hash);
            for (int i = 0; i < _questionList.Length; i++)
            {
                SSCom com = new SSCom();
                com.Group = this._currentGroup.ToString();
                com.Level = cmbLevel.SelectedIndex;
                com.MyText = _questionList[i].Trim();
                if (this.Components.Count > 0)//đề phòng trường hợp nhấn lần đầu tiên, khi đó chưa có group nào nhưng _currentGroup lại = 0
                    HideCom(this._currentGroup, this._currentPage);
                _currentPage = 0;
                AddCom(com, this._currentGroup, this._currentPage);
                ShowCom(this._currentGroup, this._currentPage);
                com.Focus();
            }
            txtNhapNhanh.Clear();
        }

        private void txtNhapNhanh_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter)
            {
                cmdNhapNhanh_Click(null, null);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult = MessageBox.Show("Xóa nhóm này?", "Xac nhan thao tac",
                                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (_dialogResult == DialogResult.No)
                return;
            if (_dialogResult == DialogResult.Yes)
            {
                // Xóa nhóm.
                if (_currentGroup > 0 && _currentGroup < Components.Count - 1)
                {
                    HideCom(_currentGroup, _currentPage);
                    List<SSCom> curcomponent = this.Components[_currentGroup];
                    for (int j = 0; j < curcomponent.Count; j++)
                    {
                        curcomponent[j].Visible = false;
                    }
                    Components.RemoveAt(_currentGroup);
                    // Xóa tab
                    this.tabGroup.TabPages.RemoveAt(_currentGroup);
                    // Dat lai ten group
                    for (int i = 0; i < this.Components.Count; i++)
                    {
                        List<SSCom> thiscomponent = this.Components[i];
                        for (int j = 0; j < thiscomponent.Count; j++)
                        {
                            thiscomponent[j].Group = i.ToString();
                        }
                        this.tabGroup.TabPages[i].Name = i.ToString();
                        this.tabGroup.TabPages[i].Text = i.ToString();
                        this.tabGroup.TabPages[i].Text = "Nhóm " + (i + 1);
                    }
                    _currentGroup = 0;
                    _currentPage = 0;
                    this.tabGroup.SelectedIndex = _currentGroup;
                    ShowCom(_currentGroup, _currentPage);
                }
                else
                {
                    MessageBox.Show("Nhóm này không xóa được, xin vui lòng sửa các phần tử");
                }
            }
        }
    }
}